The HSI_URB index is a composite remote sensing indicator that combines
built–up intensity with vegetation cover to approximate potential heat stress in urban areas.
It is particularly useful for mapping hot–spots, prioritising mitigation actions, and
supporting urban climate resilience planning.
Category: Urban & Built-up / Thermal proxy
Typical Sensors: Sentinel-2, Landsat 8/9
Applications: SUHI, UHI mapping, green infrastructure
1. Concept & Use Cases
HSI_URB (Urban Heat Stress Index) is designed as a simple proxy
for potential heat stress in urban environments. It integrates:
Built–up intensity via the NDBI (Normalized Difference Built-up Index),
which increases with impervious and dense urban surfaces.
Vegetation cooling effect via the NDVI (Normalized Difference Vegetation Index),
where dense vegetation generally mitigates heat stress.
By combining high NDBI (more built-up) with low NDVI (limited vegetation),
HSI_URB highlights locations that are likely more exposed to heat stress
under similar macro-climate conditions.
Main applications
Mapping potential urban heat hot–spots within cities.
Prioritising areas for tree planting, parks, and green roofs.
Integrating with socio-economic layers to identify vulnerable communities.
Urban planningClimate resilienceHealth & comfort
2. Data & Bands for HSI_URB
Recommended Sensors
Sentinel-2 MSI (ESA) – 10–20 m
Red: B4 (~665 nm)
NIR: B8 (~842 nm)
SWIR: B11 (~1610 nm)
Landsat 8/9 OLI – 30 m
Red: B4
NIR: B5
SWIR: B6 or B7
Good Practice
Use surface reflectance products (e.g. COPERNICUS/S2_SR).
Filter scenes by cloud percentage and/or use QA bands for cloud masking.
Restrict the analysis to the main urban footprint to avoid bias from large rural areas.
Note: HSI_URB is a relative index (dimensionless). It should be interpreted
comparatively (higher vs. lower values inside the same city or region), not as an
absolute physical measure of temperature.
3. Mathematical Definition & Interpretation
3.1 Component Indices
We first compute the vegetation and built-up indices:
NDVI – Normalized Difference Vegetation Index
NDVI = (NIR - RED) / (NIR + RED)
NDBI – Normalized Difference Built-up Index
NDBI = (SWIR - NIR) / (SWIR + NIR)
3.2 HSI_URB formulation
A simple composite form of HSI_URB can be expressed as:
HSI_URB = NDBI × (1 − NDVI)
In words: locations that are highly built-up (high NDBI) and
poorly vegetated (low NDVI) will yield larger HSI_URB values
and can be interpreted as more prone to heat stress at the surface.
3.3 Value ranges (typical)
HSI_URB is typically re-scaled or interpreted on a relative scale.
Higher values → denser built-up surfaces with limited vegetation (hot-spots).
Lower values → vegetated or less impervious surfaces (cooler micro-climate potential).
4. Google Earth Engine code – HSI_URB from Sentinel-2 (NDVI + NDBI)
// -------------------------------------------------------
// HSI_URB – Urban Heat Stress Index (NDVI & NDBI based)
// Source data: Sentinel-2 Surface Reflectance (COPERNICUS/S2_SR)
// Workflow:
// 1) Define AOI & time range
// 2) Build cloud-filtered Sentinel-2 composite
// 3) Compute NDVI & NDBI
// 4) Compute HSI_URB = NDBI * (1 - NDVI)
// 5) Visualize & optionally export as GeoTIFF
// -------------------------------------------------------
// 1. Define Area of Interest (AOI)
// Draw a geometry in the Code Editor and name it 'geometry'
var roi = geometry;
// 2. Define time range
var startDate = '2023-06-01';
var endDate = '2023-09-30'; // warm season for urban heat analysis
// 3. Load Sentinel-2 SR collection and build a median composite
var s2 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.median()
.clip(roi);
// 4. Select needed bands
// Sentinel-2: Red = B4, NIR = B8, SWIR = B11
var red = s2.select('B4');
var nir = s2.select('B8');
var swir = s2.select('B11');
// 5. Compute NDVI and NDBI
var ndvi = nir.subtract(red)
.divide(nir.add(red))
.rename('NDVI');
var ndbi = swir.subtract(nir)
.divide(swir.add(nir))
.rename('NDBI');
// 6. Compute HSI_URB
// HSI_URB = NDBI * (1 - NDVI)
var one = ee.Image.constant(1);
var hsi_urb = ndbi.multiply(one.subtract(ndvi))
.rename('HSI_URB');
// Optional: simple normalization to 0–1 range
var hsi_urb_norm = hsi_urb.unitScale(-1, 1).rename('HSI_URB');
// 7. Visualization parameters
var hsiVis = {
min: 0.0,
max: 1.0,
palette: [
'#0b3d91', // low
'#1e90ff',
'#ffffb2',
'#fd8d3c',
'#bd0026' // high
]
};
Map.centerObject(roi, 11);
Map.addLayer(hsi_urb_norm, hsiVis, 'HSI_URB (Urban Heat Stress)', true);
// Also show a true-color background for context
var s2_rgb = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.select(['B4','B3','B2'])
.median()
.clip(roi);
Map.addLayer(s2_rgb, {min: 0, max: 3000}, 'True Color (RGB)', false);
// 8. Export HSI_URB as GeoTIFF to Google Drive
Export.image.toDrive({
image: hsi_urb_norm,
description: 'HSI_URB_Export',
fileNamePrefix: 'HSI_URB',
region: roi,
scale: 10,
maxPixels: 1e13
});
Tip: You can adapt the date range for different seasons, or compute
multi-year averages and compare HSI_URB across time as part of a long-term
urban climate analysis.